package com.fxz.bean.factory.support;

import com.fxz.bean.definition.BeanDefinition;
import com.fxz.bean.factory.BeanFactory;
import com.fxz.bean.factory.registory.support.DefaultSingletonBeanRegistry;

/**
 * 抽象bean工厂
 * 实现了bean工厂 同时继承了DefaultSingletonBeanRegistry 获取到管理单实例bean的能力
 *
 * @author Fxz
 * @version 1.0
 * @date 2021-08-12 15:23
 */
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {

    /**
     * 通过Class获取对象
     *
     * @param className
     * @return
     */
    @Override
    public Object getBean(Class className) {
        //通过Class获取单实例name
        String name = getSingleton(className);
        return getBean(name);
    }

    /**
     * 通过类名获取对象
     *
     * @param name
     * @return
     */
    @Override
    public Object getBean(String name) {
        //通过name获取单实例bean
        Object singleton = getSingleton(name);
        //缓存中没有这个单实例bean
        if (singleton != null) {
            return singleton;
        }
        //通过name获取BeanDefinition
        BeanDefinition beanDefinition = getBeanDefinition(name);
        //如果是单例
        if (beanDefinition.isSingleton()) {
            //创建bean
            singleton = createBean(beanDefinition);
            //将bean注册(缓存)
            registrySingleton(name, singleton);
        } else if (beanDefinition.isPrototype()) {
            //创建出来 原型不需要缓存
            singleton = createBean(beanDefinition);
        }
        return singleton;
    }

    /**
     * 通过BeanDefinition创建bean
     *
     * @param beanDefinition
     * @return
     */
    public abstract Object createBean(BeanDefinition beanDefinition);

    /**
     * 通过name获取BeanDefinition
     *
     * @param name
     * @return
     */
    public abstract BeanDefinition getBeanDefinition(String name);
}
